package Day_0202.Spring;

/**
 * @author zxc
 * @date 2023/02/02 22:05
 **/
public class Transaction_Isolation_Level {
    public static void main(String[] args) {
        /**
         * 事务的隔离级别
         * ===》
         * 1.未提交读(Read Uncommitted)：
         * 允许脏读，也就是可能读取到其他会话中未提交事务修改的数据;
         *
         * 2.提交读(Read Committed)：
         * 只能读取到已经提交的数据;
         *
         * 3.可重复读(Repeated Read)：
         * （1）Oracle等多数数据库默认都是该级别 (不重复读);
         * （2）在同一个事务内的查询都是事务开始时刻一致的，Mysql的InnoDB默认级别;
         * （3）在SQL标准中，该隔离级别消除了不可重复读，但是还存在幻读;
         *  ===>
         *  幻读 ：
         *  （1）多个事务同时修改同一条记录，事务之间不知道彼此存在，当事务提交之后，后面的事务修改的数据将会覆盖之前事务所修改的数据;
         *  （2）某个事务在执行过程中，若是另一个事务执行插入记录操作的话，则在首个事务中读取到新插入的记录;
         *
         * 4.可串行化(Serializable)：
         * 完全串行化的读，每次读都需要获得表级共享锁，读写相互都会阻塞。
         *
         * ===》
         * 不可重复读和幻读的区别主要是：
         * （1）解决不可重复读需要锁定了当前满足条件的记录，而解决幻读需要锁定当前满足条件的记录及相近的记录。
         * ===》
         * 比如查询某个商品的信息，可重复读事务隔离级别可以保证当前商品信息被锁定，解决不可重复读；
         * 但是如果统计商品个数，中途有记录插入，可重复读事务隔离级别就不能保证两个事务统计的个数相同。
         */
    }
}
